package com.mezz.bones.framework.core.thread.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

/**
 * 传统线程与虚拟线程的差异：
 *
 * 1. **线程类型**：
 *    - 传统线程：由操作系统（OS）管理的重量级线程，每个线程都有固定的栈内存。
 *    - 虚拟线程：由 JVM 管理的轻量级线程，栈内存按需分配，开销远低于传统线程。
 *
 * 2. **调度机制**：
 *    - 传统线程：由操作系统内核调度，线程的上下文切换成本较高。
 *    - 虚拟线程：由 JVM 内部调度，切换成本低，可以同时运行数百万级别的线程。
 *
 * 3. **线程栈**：
 *    - 传统线程：分配固定大小的栈（通常为几百 KB 到几 MB），内存使用不灵活。
 *    - 虚拟线程：栈内存动态增长和收缩，能有效节省内存资源。
 *
 * 4. **线程池使用**：
 *    - 传统线程：需要使用线程池管理，避免创建过多线程导致资源耗尽。
 *    - 虚拟线程：可以直接创建大量线程，无需线程池，但可以用线程池组织任务逻辑。
 *
 * 5. **代码上的差异**：
 *    - 传统线程：
 *      使用 `ThreadPoolExecutor` 或 `Executors.newFixedThreadPool()` 等方式管理线程。
 *    - 虚拟线程：
 *      使用 `Executors.newThreadPerTaskExecutor(Thread.ofVirtual().factory())` 创建虚拟线程执行器。
 *   ```
 *
 * 6. **适用场景**：
 *    - 传统线程：适用于有限线程需求的计算密集型任务，或需要操作系统级资源的场景。
 *    - 虚拟线程：适用于大规模并发场景，例如高吞吐量网络服务和 IO 密集型任务。 */
@Configuration
public class VirtualThreadPoolConfig {

    @Bean(name = "virtualThreadExecutor")
    public ExecutorService virtualThreadExecutor() {

        // 创建自定义线程工厂，设置线程名称前缀
        ThreadFactory threadFactory = Thread.ofVirtual()
                .name("VirtualThread-", 0) // 线程名前缀，编号从 0 开始
                .factory();

        //实际调度交给JDK 内部的 ForkJoinPool 或其他调度器。
        //虚拟线程是一个轻量级的对象 用完即抛 所以没有池化的概念
        return Executors.newThreadPerTaskExecutor(threadFactory);
    }
}
